This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Reverse Engineer 2 Notebook

Objective: Analyze data from the Blair and Elrich campaigns for county executive from 2018 and 2022.

###Question 1:

First thing we did is load up the sets and clean the data:

##Blair 2018 contribs:

blair_contribs_2018 <-read.csv("data2/blair_contribs_2018.csv")
blair_contribs_2018_cleaned <-blair_contribs_2018 %>% 
clean_names  
  
  
blair_contribs_2018_cleaned %>%   
mutate(contribution_date = mdy(contribution_date)) 
blair_contribs_2018_cleaned

###Blair 2022 contribs

blair_contribs_2022 <-read.csv("data2/blair_contribs_2022.csv")
blair_contribs_2022_cleaned <- blair_contribs_2022 %>% 
clean_names 
blair_contribs_2022_cleaned %>% 
mutate(contribution_date = mdy(contribution_date)) 

blair_contribs_2022_cleaned

###Blair 2022 expenses

blair_expenses_2022 <-read.csv("data2/blair_expenses_2022.csv")
blair_expenses_2022_cleaned <-blair_expenses_2022 %>% 
  clean_names 
blair_expenses_2022_cleaned %>% 
mutate(contribution_date = mdy(expenditure_date)) 

blair_expenses_2022_cleaned

###Blair 2018 expenses

blair_expenses_2018 <-read.csv("data2/blair_expenses_2018.csv")
blair_expenses_2018_cleaned <-blair_expenses_2018 %>% 
  clean_names()
blair_expenses_2018_cleaned %>% 
  mutate(contribution_date = mdy(expenditure_date)) 
blair_expenses_2018_cleaned 

##Elrich 2018 contribs:

elrich_contribs_2018 <-read.csv("data2/elrich_contribs_2018.csv")
elrich_contribs_2018_cleaned <-elrich_contribs_2018 %>% 
  clean_names()
elrich_contribs_2018_cleaned %>% 
  mutate(contribution_date = mdy(contribution_date)) 

elrich_contribs_2018_cleaned

###Elrich Contribs 2022

elrich_contribs_2022 <-read.csv("data2/elrich_contribs_2022.csv")
elrich_contribs_2022_cleaned <-elrich_contribs_2022 %>%
  clean_names()
elrich_contribs_2022_cleaned %>% 
  mutate(contribution_date = mdy(contribution_date)) 

elrich_contribs_2022_cleaned

###Elrich 2018

elrich_expenses_2018 <-read.csv("data2/elrich_expenses_2018.csv")
elrich_expenses_2018_cleaned <-elrich_expenses_2018 %>% 
  clean_names()
elrich_expenses_2018_cleaned %>% 
    mutate(contribution_date = mdy(expenditure_date)) 
elrich_expenses_2018_cleaned

###Elrich Expenses 2022

elrich_expenses_2022 <-read.csv("data2/elrich_expenses_2022.csv")
elrich_expenses_2022_cleaned <-elrich_expenses_2022 %>% 
  clean_names()
elrich_expenses_2022_cleaned %>% 
  mutate(contribution_date = mdy(expenditure_date)) 
elrich_expenses_2022_cleaned

##County primary election results:

dem_precincts_18 <- read.csv("data2/dem_precincts_2018.csv")
dem_precincts_22 <- read.csv("data2/dem_precincts_2022.csv")
dem_county_22 <- read.csv("data2/dem_county_2022.csv")
dem_county_18 <- read.csv("data2/dem_county_2018.csv")

###Question 1 1. How much money did David Blair and Marc Elrich fund themselves in 2022 vs. 2018? Blair is a businessman and millionaire, so it makes sense that he’s funding his own campaign. But how much exactly is he putting into it, and how does it compare to the past election and to how much Elrich’s campaign is raising?

###2022:

blair_contribs_2022_cleaned %>%
filter(contributor_name == "BLAIR  DAVID  THOMAS") %>%
group_by(contributor_name) %>%
summarize(total_blair = sum(contribution_amount))
elrich_contribs_2022_cleaned %>%
group_by(contributor_name) %>%
summarize(total_elrich = sum(contribution_amount)) %>%
arrange(desc(total_elrich))

###2018:

blair_contribs_2018_cleaned %>%
filter(contributor_name == "BLAIR  DAVID  THOMAS") %>%
group_by(contributor_name) %>%
summarize(total_blair = sum(contribution_amount))
elrich_contribs_2018_cleaned %>%
group_by(contributor_name) %>%
summarize(total_elrich = sum(contribution_amount)) %>%
arrange(desc(total_elrich))

###Question 2: Who were the top 5 contributors to Blair and Elrich in 2022? How about in 2018? What are their connections to the candidates?

###2022

top_blair_contribs_22 <- blair_contribs_2018_cleaned %>%
  mutate(contributor_name = case_when(
    contributor_name == "BLAIR  DAVID  THOMAS" ~ "Blair  David  Thomas",
    TRUE ~ contributor_name
  )) %>%
  group_by(contributor_name) %>%
  summarize(total = sum(contribution_amount)) %>%
  arrange(desc(total)) %>%
  head(5)
top_blair_contribs_22
top_elrich_contribs_22 <- elrich_contribs_2022_cleaned %>%
  group_by(contributor_name) %>%
  summarize(total = sum(contribution_amount)) %>%
  arrange(desc(total)) %>%
  head(6)
top_elrich_contribs_22

###2018

top_blair_contribs_18 <- blair_contribs_2018_cleaned %>%
  mutate(contributor_name = case_when(
    contributor_name == "BLAIR  DAVID  THOMAS" ~ "Blair  David  Thomas",
    TRUE ~ contributor_name
  )) %>%
  group_by(contributor_name) %>%
  summarize(total = sum(contribution_amount)) %>%
  arrange(desc(total)) %>%
  head(5)
top_blair_contribs_18
top_elrich_contribs_18 <- elrich_contribs_2018_cleaned %>%
  group_by(contributor_name) %>%
  summarize(total = sum(contribution_amount)) %>%
  arrange(desc(total)) %>%
  head(6)
top_elrich_contribs_18

###Question 3: David Blair got more early/election day votes in 2022. Elrich got more Mail-in votes in 2022. How did that compare to 2018? People want to know how Marc Elrich won both times, first by 72 voters in 2018 and then 32 in 2022. Where did Marc do well in the three categories: Early voting, election day, and mail-in votes. Did this sway the result at all?

dem_county_18_cleaned <-dem_county_18 %>% 
  clean_names()
dem_county_22_cleaned <-dem_county_22 %>% 
  clean_names()

blair <- dem_county_18_cleaned %>%
filter(candidate_name == "David Blair")
elrich <-  dem_county_18_cleaned %>%
  filter(candidate_name == "Marc Elrich")
blair_elrich <-  bind_rows(blair, elrich)
blair_elrich

###Question 4: Which parts of the county voted for Elrich and which voted for Blair based on precinct-level voting? Are there differences in demographics of those areas? What about income?

\

library(sf)
moco_precincts <- st_read("data2/moco_boundary.gdb")
Reading layer `CNTY_BNDY' from data source 
  `C:\Users\merca\Documents\GitHub\data_journalism_fall_2022\major_assignments\reverse_engineering\data2\moco_boundary.gdb' 
  using driver `OpenFileGDB'
Simple feature collection with 1 feature and 3 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -77.52769 ymin: 38.93425 xmax: -76.88764 ymax: 39.35434
Geodetic CRS:  WGS 84
glimpse(moco_precincts)
Rows: 1
Columns: 4
$ NAME         <chr> "MONTGOMERY COUNTY"
$ SHAPE_Length <dbl> 1.895903
$ SHAPE_Area   <dbl> 0.1367927
$ SHAPE        <MULTIPOLYGON [°]> MULTIPOLYGON (((-77.18523 3...
moco_precincts %>%
  ggplot() +
  geom_sf() +
  theme_minimal()

###Question 5: Where did David Blair and Marc Elrich spend their money on campaign finance resources? Ie: Meta advertisements, yard signs, TV, consulting? This would be interesting to know since Blair made a very big concerted effort to build his profile during the campaign while Elrich relied on incumbency and mainly TV ads to help him.

blair_expenses_2022_cleaned %>%
group_by(expense_category) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))
#spent nearly $3.1 mil in 2022 ... top 3 are Media, Salarties and Direct Mail by Mail House (R)

#dive into media

blair_expenses_2022_cleaned %>%
filter(expense_category == "Media") %>%
group_by(expense_purpose) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))

Spent 1773.00 on online advertising

elrich_expenses_2022_cleaned %>%
group_by(expense_category) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))

Elrich spent $528393.29 on media which is significantly less than Blair

elrich_expenses_2022_cleaned %>%
filter(expense_category == "Media") %>%
group_by(expense_purpose) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))

#Elrich spent 32K on consulting fees.

This is what I wrote for No. 5 “There are signifant differences in spending between Elrich and Blair here and it shows how the capital on hand can really influence the means a candidate has to win or lose a race. Elrich in 2022 went all-in on TV spending. Blair spent a lot more in 2018 as well.”

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KDQpSZXZlcnNlIEVuZ2luZWVyIDIgTm90ZWJvb2sNCg0KT2JqZWN0aXZlOiBBbmFseXplIGRhdGEgZnJvbSB0aGUgQmxhaXIgYW5kIEVscmljaCBjYW1wYWlnbnMgZm9yIGNvdW50eSBleGVjdXRpdmUgZnJvbSAyMDE4IGFuZCAyMDIyLg0KDQojIyNRdWVzdGlvbiAxOg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpvcHRpb25zKHNjaXBlbj05OTkpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShqYW5pdG9yKQ0KDQpgYGANCg0KDQoNCkZpcnN0IHRoaW5nIHdlIGRpZCBpcyBsb2FkIHVwIHRoZSBzZXRzIGFuZCBjbGVhbiB0aGUgZGF0YToNCg0KIyNCbGFpciAyMDE4IGNvbnRyaWJzOg0KDQpgYGB7cn0NCmJsYWlyX2NvbnRyaWJzXzIwMTggPC1yZWFkLmNzdigiZGF0YTIvYmxhaXJfY29udHJpYnNfMjAxOC5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfY29udHJpYnNfMjAxOF9jbGVhbmVkIDwtYmxhaXJfY29udHJpYnNfMjAxOCAlPiUgDQpjbGVhbl9uYW1lcyAgDQogIA0KICANCmJsYWlyX2NvbnRyaWJzXzIwMThfY2xlYW5lZCAlPiUgICANCm11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShjb250cmlidXRpb25fZGF0ZSkpIA0KYmxhaXJfY29udHJpYnNfMjAxOF9jbGVhbmVkDQpgYGANCg0KDQojIyNCbGFpciAyMDIyIGNvbnRyaWJzDQoNCmBgYHtyfQ0KYmxhaXJfY29udHJpYnNfMjAyMiA8LXJlYWQuY3N2KCJkYXRhMi9ibGFpcl9jb250cmlic18yMDIyLmNzdiIpDQpgYGANCg0KYGBge3J9DQpibGFpcl9jb250cmlic18yMDIyX2NsZWFuZWQgPC0gYmxhaXJfY29udHJpYnNfMjAyMiAlPiUgDQpjbGVhbl9uYW1lcyANCmBgYCAgDQogIA0KYGBge3J9ICANCmJsYWlyX2NvbnRyaWJzXzIwMjJfY2xlYW5lZCAlPiUgDQptdXRhdGUoY29udHJpYnV0aW9uX2RhdGUgPSBtZHkoY29udHJpYnV0aW9uX2RhdGUpKSANCg0KYmxhaXJfY29udHJpYnNfMjAyMl9jbGVhbmVkDQpgYGANCg0KIyMjQmxhaXIgMjAyMiBleHBlbnNlcw0KDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMjIgPC1yZWFkLmNzdigiZGF0YTIvYmxhaXJfZXhwZW5zZXNfMjAyMi5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfZXhwZW5zZXNfMjAyMl9jbGVhbmVkIDwtYmxhaXJfZXhwZW5zZXNfMjAyMiAlPiUgDQogIGNsZWFuX25hbWVzIA0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfZXhwZW5zZXNfMjAyMl9jbGVhbmVkICU+JSANCm11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShleHBlbmRpdHVyZV9kYXRlKSkgDQoNCmJsYWlyX2V4cGVuc2VzXzIwMjJfY2xlYW5lZA0KYGBgDQoNCiMjI0JsYWlyIDIwMTggZXhwZW5zZXMNCg0KDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMTggPC1yZWFkLmNzdigiZGF0YTIvYmxhaXJfZXhwZW5zZXNfMjAxOC5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfZXhwZW5zZXNfMjAxOF9jbGVhbmVkIDwtYmxhaXJfZXhwZW5zZXNfMjAxOCAlPiUgDQogIGNsZWFuX25hbWVzKCkNCmBgYA0KDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMThfY2xlYW5lZCAlPiUgDQogIG11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShleHBlbmRpdHVyZV9kYXRlKSkgDQpibGFpcl9leHBlbnNlc18yMDE4X2NsZWFuZWQgDQpgYGANCg0KIyNFbHJpY2ggMjAxOCBjb250cmliczoNCg0KYGBge3J9DQplbHJpY2hfY29udHJpYnNfMjAxOCA8LXJlYWQuY3N2KCJkYXRhMi9lbHJpY2hfY29udHJpYnNfMjAxOC5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMThfY2xlYW5lZCA8LWVscmljaF9jb250cmlic18yMDE4ICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMThfY2xlYW5lZCAlPiUgDQogIG11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShjb250cmlidXRpb25fZGF0ZSkpIA0KDQplbHJpY2hfY29udHJpYnNfMjAxOF9jbGVhbmVkDQpgYGANCg0KIyMjRWxyaWNoIENvbnRyaWJzIDIwMjINCg0KYGBge3J9DQplbHJpY2hfY29udHJpYnNfMjAyMiA8LXJlYWQuY3N2KCJkYXRhMi9lbHJpY2hfY29udHJpYnNfMjAyMi5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMjJfY2xlYW5lZCA8LWVscmljaF9jb250cmlic18yMDIyICU+JQ0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfY29udHJpYnNfMjAyMl9jbGVhbmVkICU+JSANCiAgbXV0YXRlKGNvbnRyaWJ1dGlvbl9kYXRlID0gbWR5KGNvbnRyaWJ1dGlvbl9kYXRlKSkgDQoNCmVscmljaF9jb250cmlic18yMDIyX2NsZWFuZWQNCmBgYA0KDQojIyNFbHJpY2ggMjAxOA0KDQpgYGB7cn0NCmVscmljaF9leHBlbnNlc18yMDE4IDwtcmVhZC5jc3YoImRhdGEyL2VscmljaF9leHBlbnNlc18yMDE4LmNzdiIpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAxOF9jbGVhbmVkIDwtZWxyaWNoX2V4cGVuc2VzXzIwMTggJT4lIA0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAxOF9jbGVhbmVkICU+JSANCiAgICBtdXRhdGUoY29udHJpYnV0aW9uX2RhdGUgPSBtZHkoZXhwZW5kaXR1cmVfZGF0ZSkpIA0KZWxyaWNoX2V4cGVuc2VzXzIwMThfY2xlYW5lZA0KYGBgDQojIyNFbHJpY2ggRXhwZW5zZXMgMjAyMg0KDQpgYGB7cn0NCmVscmljaF9leHBlbnNlc18yMDIyIDwtcmVhZC5jc3YoImRhdGEyL2VscmljaF9leHBlbnNlc18yMDIyLmNzdiIpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAyMl9jbGVhbmVkIDwtZWxyaWNoX2V4cGVuc2VzXzIwMjIgJT4lIA0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAyMl9jbGVhbmVkICU+JSANCiAgbXV0YXRlKGNvbnRyaWJ1dGlvbl9kYXRlID0gbWR5KGV4cGVuZGl0dXJlX2RhdGUpKSANCmVscmljaF9leHBlbnNlc18yMDIyX2NsZWFuZWQNCmBgYA0KDQoNCiMjQ291bnR5IHByaW1hcnkgZWxlY3Rpb24gcmVzdWx0czoNCg0KDQoNCmBgYHtyfQ0KZGVtX3ByZWNpbmN0c18xOCA8LSByZWFkLmNzdigiZGF0YTIvZGVtX3ByZWNpbmN0c18yMDE4LmNzdiIpDQpgYGANCg0KYGBge3J9DQpkZW1fcHJlY2luY3RzXzIyIDwtIHJlYWQuY3N2KCJkYXRhMi9kZW1fcHJlY2luY3RzXzIwMjIuY3N2IikNCmBgYA0KDQoNCg0KDQoNCmBgYHtyfQ0KZGVtX2NvdW50eV8yMiA8LSByZWFkLmNzdigiZGF0YTIvZGVtX2NvdW50eV8yMDIyLmNzdiIpDQpgYGANCg0KYGBge3J9DQpkZW1fY291bnR5XzE4IDwtIHJlYWQuY3N2KCJkYXRhMi9kZW1fY291bnR5XzIwMTguY3N2IikNCmBgYA0KDQoNCg0KDQojIyNRdWVzdGlvbiAxIDEuIEhvdyBtdWNoIG1vbmV5IGRpZCBEYXZpZCBCbGFpciBhbmQgTWFyYyBFbHJpY2ggZnVuZCB0aGVtc2VsdmVzIGluIDIwMjIgdnMuIDIwMTg/IEJsYWlyIGlzIGEgYnVzaW5lc3NtYW4gYW5kIG1pbGxpb25haXJlLCBzbyBpdCBtYWtlcyBzZW5zZSB0aGF0IGhl4oCZcyBmdW5kaW5nIGhpcyBvd24gY2FtcGFpZ24uIEJ1dCBob3cgbXVjaCBleGFjdGx5IGlzIGhlIHB1dHRpbmcgaW50byBpdCwgYW5kIGhvdyBkb2VzIGl0IGNvbXBhcmUgdG8gdGhlIHBhc3QgZWxlY3Rpb24gYW5kIHRvIGhvdyBtdWNoIEVscmljaOKAmXMgY2FtcGFpZ24gaXMgcmFpc2luZz8NCg0KIyMjMjAyMjoNCg0KYGBge3J9DQpibGFpcl9jb250cmlic18yMDIyX2NsZWFuZWQgJT4lDQpmaWx0ZXIoY29udHJpYnV0b3JfbmFtZSA9PSAiQkxBSVIgIERBVklEICBUSE9NQVMiKSAlPiUNCmdyb3VwX2J5KGNvbnRyaWJ1dG9yX25hbWUpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2JsYWlyID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMjJfY2xlYW5lZCAlPiUNCmdyb3VwX2J5KGNvbnRyaWJ1dG9yX25hbWUpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2VscmljaCA9IHN1bShjb250cmlidXRpb25fYW1vdW50KSkgJT4lDQphcnJhbmdlKGRlc2ModG90YWxfZWxyaWNoKSkNCmBgYA0KIyMjMjAxODoNCg0KYGBge3J9DQpibGFpcl9jb250cmlic18yMDE4X2NsZWFuZWQgJT4lDQpmaWx0ZXIoY29udHJpYnV0b3JfbmFtZSA9PSAiQkxBSVIgIERBVklEICBUSE9NQVMiKSAlPiUNCmdyb3VwX2J5KGNvbnRyaWJ1dG9yX25hbWUpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2JsYWlyID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKQ0KYGBgDQpgYGB7cn0NCmVscmljaF9jb250cmlic18yMDE4X2NsZWFuZWQgJT4lDQpncm91cF9ieShjb250cmlidXRvcl9uYW1lKSAlPiUNCnN1bW1hcml6ZSh0b3RhbF9lbHJpY2ggPSBzdW0oY29udHJpYnV0aW9uX2Ftb3VudCkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX2VscmljaCkpDQpgYGANCiANCiMjI1F1ZXN0aW9uIDI6IFdobyB3ZXJlIHRoZSB0b3AgNSBjb250cmlidXRvcnMgdG8gQmxhaXIgYW5kIEVscmljaCBpbiAyMDIyPyBIb3cgYWJvdXQgaW4gMjAxOD8gV2hhdCBhcmUgdGhlaXIgY29ubmVjdGlvbnMgdG8gdGhlIGNhbmRpZGF0ZXM/DQoNCg0KIyMjMjAyMg0KYGBge3J9DQp0b3BfYmxhaXJfY29udHJpYnNfMjIgPC0gYmxhaXJfY29udHJpYnNfMjAxOF9jbGVhbmVkICU+JQ0KICBtdXRhdGUoY29udHJpYnV0b3JfbmFtZSA9IGNhc2Vfd2hlbigNCiAgICBjb250cmlidXRvcl9uYW1lID09ICJCTEFJUiAgREFWSUQgIFRIT01BUyIgfiAiQmxhaXIgIERhdmlkICBUaG9tYXMiLA0KICAgIFRSVUUgfiBjb250cmlidXRvcl9uYW1lDQogICkpICU+JQ0KICBncm91cF9ieShjb250cmlidXRvcl9uYW1lKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsKSkgJT4lDQogIGhlYWQoNSkNCnRvcF9ibGFpcl9jb250cmlic18yMg0KYGBgDQoNCmBgYHtyfQ0KdG9wX2VscmljaF9jb250cmlic18yMiA8LSBlbHJpY2hfY29udHJpYnNfMjAyMl9jbGVhbmVkICU+JQ0KICBncm91cF9ieShjb250cmlidXRvcl9uYW1lKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsKSkgJT4lDQogIGhlYWQoNikNCnRvcF9lbHJpY2hfY29udHJpYnNfMjINCmBgYA0KDQojIyMyMDE4DQoNCmBgYHtyfQ0KdG9wX2JsYWlyX2NvbnRyaWJzXzE4IDwtIGJsYWlyX2NvbnRyaWJzXzIwMThfY2xlYW5lZCAlPiUNCiAgbXV0YXRlKGNvbnRyaWJ1dG9yX25hbWUgPSBjYXNlX3doZW4oDQogICAgY29udHJpYnV0b3JfbmFtZSA9PSAiQkxBSVIgIERBVklEICBUSE9NQVMiIH4gIkJsYWlyICBEYXZpZCAgVGhvbWFzIiwNCiAgICBUUlVFIH4gY29udHJpYnV0b3JfbmFtZQ0KICApKSAlPiUNCiAgZ3JvdXBfYnkoY29udHJpYnV0b3JfbmFtZSkgJT4lDQogIHN1bW1hcml6ZSh0b3RhbCA9IHN1bShjb250cmlidXRpb25fYW1vdW50KSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JQ0KICBoZWFkKDUpDQp0b3BfYmxhaXJfY29udHJpYnNfMTgNCmBgYA0KDQpgYGB7cn0NCnRvcF9lbHJpY2hfY29udHJpYnNfMTggPC0gZWxyaWNoX2NvbnRyaWJzXzIwMThfY2xlYW5lZCAlPiUNCiAgZ3JvdXBfYnkoY29udHJpYnV0b3JfbmFtZSkgJT4lDQogIHN1bW1hcml6ZSh0b3RhbCA9IHN1bShjb250cmlidXRpb25fYW1vdW50KSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JQ0KICBoZWFkKDYpDQp0b3BfZWxyaWNoX2NvbnRyaWJzXzE4DQpgYGANCg0KIyMjUXVlc3Rpb24gMzogRGF2aWQgQmxhaXIgZ290IG1vcmUgZWFybHkvZWxlY3Rpb24gZGF5IHZvdGVzIGluIDIwMjIuIEVscmljaCBnb3QgbW9yZSBNYWlsLWluIHZvdGVzIGluIDIwMjIuIEhvdyBkaWQgdGhhdCBjb21wYXJlIHRvIDIwMTg/IFBlb3BsZSB3YW50IHRvIGtub3cgaG93IE1hcmMgRWxyaWNoIHdvbiBib3RoIHRpbWVzLCBmaXJzdCBieSA3MiB2b3RlcnMgaW4gMjAxOCBhbmQgdGhlbiAzMiBpbiAyMDIyLiBXaGVyZSBkaWQgTWFyYyBkbyB3ZWxsIGluIHRoZSB0aHJlZSBjYXRlZ29yaWVzOiBFYXJseSB2b3RpbmcsIGVsZWN0aW9uIGRheSwgYW5kIG1haWwtaW4gdm90ZXMuIERpZCB0aGlzIHN3YXkgdGhlIHJlc3VsdCBhdCBhbGw/DQoNCmBgYHtyfQ0KZGVtX2NvdW50eV8xOF9jbGVhbmVkIDwtZGVtX2NvdW50eV8xOCAlPiUgDQogIGNsZWFuX25hbWVzKCkNCmBgYA0KDQoNCmBgYHtyfQ0KZGVtX2NvdW50eV8yMl9jbGVhbmVkIDwtZGVtX2NvdW50eV8yMiAlPiUgDQogIGNsZWFuX25hbWVzKCkNCmBgYA0KDQoNCg0KYGBge3J9DQoNCmJsYWlyIDwtIGRlbV9jb3VudHlfMThfY2xlYW5lZCAlPiUNCmZpbHRlcihjYW5kaWRhdGVfbmFtZSA9PSAiRGF2aWQgQmxhaXIiKQ0KZWxyaWNoIDwtICBkZW1fY291bnR5XzE4X2NsZWFuZWQgJT4lDQogIGZpbHRlcihjYW5kaWRhdGVfbmFtZSA9PSAiTWFyYyBFbHJpY2giKQ0KYmxhaXJfZWxyaWNoIDwtICBiaW5kX3Jvd3MoYmxhaXIsIGVscmljaCkNCmJsYWlyX2VscmljaA0KYGBgDQoNCg0KDQoNCg0KIyMjUXVlc3Rpb24gNDogV2hpY2ggcGFydHMgb2YgdGhlIGNvdW50eSB2b3RlZCBmb3IgRWxyaWNoIGFuZCB3aGljaCB2b3RlZCBmb3IgQmxhaXIgYmFzZWQgb24gcHJlY2luY3QtbGV2ZWwgdm90aW5nPyBBcmUgdGhlcmUgZGlmZmVyZW5jZXMgaW4gZGVtb2dyYXBoaWNzIG9mIHRob3NlIGFyZWFzPyBXaGF0IGFib3V0IGluY29tZT8gDQoNClxcDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCmBgYA0KDQoNCmBgYHtyfQ0KbW9jb19wcmVjaW5jdHMgPC0gc3RfcmVhZCgiZGF0YTIvbW9jb19ib3VuZGFyeS5nZGIiKQ0KDQpnbGltcHNlKG1vY29fcHJlY2luY3RzKQ0KYGBgDQoNCg0KYGBge3J9DQptb2NvX3ByZWNpbmN0cyAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCg0KDQoNCiMjI1F1ZXN0aW9uIDU6IFdoZXJlIGRpZCBEYXZpZCBCbGFpciBhbmQgTWFyYyBFbHJpY2ggc3BlbmQgdGhlaXIgbW9uZXkgb24gY2FtcGFpZ24gZmluYW5jZSByZXNvdXJjZXM/IEllOiBNZXRhIGFkdmVydGlzZW1lbnRzLCB5YXJkIHNpZ25zLCBUViwgY29uc3VsdGluZz8gVGhpcyB3b3VsZCBiZSBpbnRlcmVzdGluZyB0byBrbm93IHNpbmNlIEJsYWlyIG1hZGUgYSB2ZXJ5IGJpZyBjb25jZXJ0ZWQgZWZmb3J0IHRvIGJ1aWxkIGhpcyBwcm9maWxlIGR1cmluZyB0aGUgY2FtcGFpZ24gd2hpbGUgRWxyaWNoIHJlbGllZCBvbiBpbmN1bWJlbmN5IGFuZCBtYWlubHkgVFYgYWRzIHRvIGhlbHAgaGltLiANCg0KDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMjJfY2xlYW5lZCAlPiUNCmdyb3VwX2J5KGV4cGVuc2VfY2F0ZWdvcnkpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2NhdGVnb3J5ID0gc3VtKGFtb3VudCkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX2NhdGVnb3J5KSkNCiNzcGVudCBuZWFybHkgJDMuMSBtaWwgaW4gMjAyMiAuLi4gdG9wIDMgYXJlIE1lZGlhLCBTYWxhcnRpZXMgYW5kIERpcmVjdCBNYWlsIGJ5IE1haWwgSG91c2UgKFIpDQpgYGANCiNkaXZlIGludG8gbWVkaWENCmBgYHtyfQ0KYmxhaXJfZXhwZW5zZXNfMjAyMl9jbGVhbmVkICU+JQ0KZmlsdGVyKGV4cGVuc2VfY2F0ZWdvcnkgPT0gIk1lZGlhIikgJT4lDQpncm91cF9ieShleHBlbnNlX3B1cnBvc2UpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2NhdGVnb3J5ID0gc3VtKGFtb3VudCkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX2NhdGVnb3J5KSkNCmBgYA0KIyBTcGVudCAxNzczLjAwCSBvbiBvbmxpbmUgYWR2ZXJ0aXNpbmcNCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAyMl9jbGVhbmVkICU+JQ0KZ3JvdXBfYnkoZXhwZW5zZV9jYXRlZ29yeSkgJT4lDQpzdW1tYXJpemUodG90YWxfY2F0ZWdvcnkgPSBzdW0oYW1vdW50KSkgJT4lDQphcnJhbmdlKGRlc2ModG90YWxfY2F0ZWdvcnkpKQ0KYGBgDQpFbHJpY2ggc3BlbnQgJDUyODM5My4yOSBvbiBtZWRpYSB3aGljaCBpcyBzaWduaWZpY2FudGx5IGxlc3MgdGhhbiBCbGFpcg0KDQpgYGB7cn0NCmVscmljaF9leHBlbnNlc18yMDIyX2NsZWFuZWQgJT4lDQpmaWx0ZXIoZXhwZW5zZV9jYXRlZ29yeSA9PSAiTWVkaWEiKSAlPiUNCmdyb3VwX2J5KGV4cGVuc2VfcHVycG9zZSkgJT4lDQpzdW1tYXJpemUodG90YWxfY2F0ZWdvcnkgPSBzdW0oYW1vdW50KSkgJT4lDQphcnJhbmdlKGRlc2ModG90YWxfY2F0ZWdvcnkpKQ0KYGBgDQoNCiNFbHJpY2ggc3BlbnQgMzJLIG9uIGNvbnN1bHRpbmcgZmVlcy4NCg0KVGhpcyBpcyB3aGF0IEkgd3JvdGUgZm9yIE5vLiA1ICJUaGVyZSBhcmUgc2lnbmlmYW50IGRpZmZlcmVuY2VzIGluIHNwZW5kaW5nIGJldHdlZW4gRWxyaWNoIGFuZCBCbGFpciBoZXJlIGFuZCBpdCBzaG93cyBob3cgdGhlIGNhcGl0YWwgb24gaGFuZCBjYW4gcmVhbGx5IGluZmx1ZW5jZSB0aGUgbWVhbnMgYSBjYW5kaWRhdGUgaGFzIHRvIHdpbiBvciBsb3NlIGEgcmFjZS4gRWxyaWNoIGluIDIwMjIgd2VudCBhbGwtaW4gb24gVFYgc3BlbmRpbmcuIEJsYWlyIHNwZW50IGEgbG90IG1vcmUgaW4gMjAxOCBhcyB3ZWxsLiI=